perm filename FNTFAI.FAI[VIS,HPM]2 blob sn#272881 filedate 1977-03-28 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	FNTFAI
C00003 00003	L3X2:	POP	P,RETAD			 L3X2(PIC,YLO,XLO,CHAR)
C00007 00004	L6X4:	POP	P,RETAD			 L6X4(PIC,YLO,XLO,CHAR)
C00011 00005	L3Y4:	POP	P,RETAD			 L3Y4(PIC,YLO,XLO,CHAR)
C00015 00006		TITLE	FNTVEC
C00019 ENDMK
C⊗;
	TITLE	FNTFAI
	ENTRY	L3X2, L3Y4, L6X4

PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14

T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ PICPNT←5 ↔ BITPNT←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ NFWD←12 ↔ RASW←13 ↔ YEX←14 ↔ PICPT2←CHAR←15
P←17
RETAD:	0
L3X2:	POP	P,RETAD			; L3X2(PIC,YLO,XLO,CHAR)
	POP	P,CHAR		;routine to assemble a 3 by 2 compressed character.
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	JUMPL	XLO,@RETAD
	MOVE	RASW,(CHAR)
	LSH	RASW,-33		;fetch raster width from font def
	MOVEI	XHI,-1(RASW)		;use it with XLO to get XHI
	ADD	XHI,XLO
	HRRZ	YEX,1(CHAR)		;get DATA ROW COUNT from def
	MOVE	T,YLO
	ADD	T,YEX			;bounds check for Y
	ASH	T,-1
	SUB	T,PCLN(PIC)
	ASH	T,1
	CAILE	T,0
	SUB	YEX,T
        JUMPLE	YEX,@RETAD
	MOVEI	BITPNT,1(CHAR)		;construct byte pointer
	TLO	BITPNT,100		;for bit array
	
	IDIVI	XLO,3			;get position of starting bit
	IDIVI	XHI,3			;and finishing bit
        CAML	XHI,LNBY(PIC)
	JRST	@RETAD
	SUB	XHI,XLO			;calculate number of pic bytes-1
	JUMPG	XHI,GT1			;and if exactly one byte,
	SUB	XHR,XLR			;calculate how many bits in it-1
GT1:	ASH	XLR,1			;calculate jump offset for main loop
	SUBI	XHR,2			;and for trailing last byte
	MOVN	XHR,XHR
	ASH	XHR,1
	MOVE	TT,BPTAB(PIC)		;set up skeleton byte pointer
	ADD	TT,XLO			;for X
	MOVE	PICPT2,(TT)

	PUSH	P,12

	MOVNI	YEX,-1(YEX)		;loop counter for Y, neg count in left
	HRL	YLO,YEX			; <TWICE> line number in right
		
YLOOP:	MOVEI	TT,(YLO)		;finish up byte pointer by inserting
	ASH	TT,-1			;line address for current Y position
	ADDI	TT,LINTAB(PIC)
	MOVE	PICPNT,PICPT2
	ADD	PICPNT,(TT)

	LDB	TT,PICPNT		;pick up first affected picture byte
	JUMPE	XHI,RTL(XHR)		;if only one altogether, skip loop
	MOVE	NFWD,XHI		;if more than one, do first fractional
	JRST	STL(XLR)		;one

FWL:	ILDB	TT,PICPNT		;and then do all the others but the last
STL:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;check for byte overflow
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it
	SOJG	NFWD,FWL

	ILDB	TT,PICPNT		;the last affected byte
      	JRST	RTL(XHR)		;see how much of it to do
RTL:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;bounds check
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it

	MOVE	T,BITPNT		;check if time to skip BP
	LSH	T,-36			;in font definition
	CAMGE	T,RASW			;to next line
	AND	BITPNT,[7777777777]

	AOBJN	YLO,YLOOP		;check if all lines done
	POP	P,12
	JRST	@RETAD
L6X4:	POP	P,RETAD			; L6X4(PIC,YLO,XLO,CHAR)
	POP	P,CHAR
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	JUMPL	XLO,@RETAD
	MOVE	RASW,(CHAR)
	LSH	RASW,-33		;fetch raster width from font def
	MOVEI	XHI,-1(RASW)		;use it with XLO to get XHI
	ADD	XHI,XLO
	HRRZ	YEX,1(CHAR)		;get DATA ROW COUNT from def
	MOVE	T,YLO
	ADD	T,YEX			;bounds check for Y
	ASH	T,-2
	SUB	T,PCLN(PIC)
	ASH	T,2
	CAILE	T,0
	SUB	YEX,T
        JUMPLE	YEX,@RETAD
	MOVEI	BITPNT,1(CHAR)		;construct byte pointer
	TLO	BITPNT,100		;for bit array
	
	IDIVI	XLO,6			;get position of starting bit
	IDIVI	XHI,6			;and finishing bit
        CAML	XHI,LNBY(PIC)
	JRST	@RETAD
	SUB	XHI,XLO			;calculate number of pic bytes-1
	JUMPG	XHI,GT3			;and if exactly one byte,
	SUB	XHR,XLR			;calculate how many bits in it-1
GT3:	ASH	XLR,1			;calculate jump offset for main loop
 	SUBI	XHR,5			;and for trailing last byte
	MOVN	XHR,XHR
	ASH	XHR,1
	MOVE	TT,BPTAB(PIC)		;set up skeleton byte pointer
	ADD	TT,XLO			;for X
	MOVE	PICPT2,(TT)

	PUSH	P,12

	MOVNI	YEX,-1(YEX)		; loop counter for Y, neg count in left
	HRL	YLO,YEX			; <TWICE> line number in right
		
YLOOP3:	MOVEI	TT,(YLO)		;finish up byte pointer by inserting
	ASH	TT,-2			;line address for current Y position
	ADDI	TT,LINTAB(PIC)
	MOVE	PICPNT,PICPT2
	ADD	PICPNT,(TT)

	LDB	TT,PICPNT		;pick up first affected picture byte
	JUMPE	XHI,RTL3(XHR)		;if only one altogether, skip loop
	MOVE	NFWD,XHI		;if more than one, do first fractional
	JRST	STL3(XLR)		;one

FWL3:	ILDB	TT,PICPNT		;and then do all the others but the last
STL3:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;check for byte overflow
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it
	SOJG	NFWD,FWL3

	ILDB	TT,PICPNT		;the last affected byte
      	JRST	RTL3(XHR)		;see how much of it to do
RTL3:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;bounds check
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it

	MOVE	T,BITPNT		;check if time to skip BP
	LSH	T,-36			;in font definition
	CAMGE	T,RASW			;to next line
	AND	BITPNT,[7777777777]

	AOBJN	YLO,YLOOP3		;check if all lines done
	POP	P,12
	JRST	@RETAD
L3Y4:	POP	P,RETAD			; L3Y4(PIC,YLO,XLO,CHAR)
	POP	P,CHAR			;for sideways full pages
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	JUMPL	XLO,@RETAD
	MOVE	RASW,(CHAR)
	LSH	RASW,-33		;fetch raster width from font def
	MOVEI	XHI,-1(RASW)		;use it with XLO to get XHI
	ADD	XHI,XLO
	HRRZ	YEX,1(CHAR)		;get DATA ROW COUNT from def
	MOVE	T,YLO
	ADD	T,YEX			;bounds check for Y
	ASH	T,-2
	SUB	T,LNBY(PIC)
	ASH	T,2
	CAILE	T,0
	SUB	YEX,T
        JUMPE	YEX,@RETAD
	MOVEI	BITPNT,1(CHAR)		;construct byte pointer
	TLO	BITPNT,100		;for bit array
	
	IDIVI	XLO,3			;get position of starting bit
	IDIVI	XHI,3			;and finishing bit
        CAML	XHI,PCLN(PIC)
	JRST	@RETAD
	SUB	XHI,XLO			;calculate number of pic bytes-1
	JUMPG	XHI,GT2			;and if exactly one byte,
	SUB	XHR,XLR			;calculate how many bits in it-1
GT2:	ASH	XLR,1			;calculate jump offset for main loop
	SUBI	XHR,2			;and for trailing last byte
	MOVN	XHR,XHR
	ASH	XHR,1
	MOVEI	TT,LINTAB(PIC)		;set up skeleton byte pointer
	ADD	TT,PCLN(PIC)
	SUBI	TT,1(XLO)			;for X
	MOVE	PICPT2,(TT)

	PUSH	P,12

	MOVNI	YEX,-1(YEX)		; loop counter for Y, neg count in left
	HRL	YLO,YEX			; <TWICE> line number in right
		
YLOOP2:	MOVEI	TT,(YLO)		;finish up byte pointer by inserting
	ASH	TT,-2			;line address for current Y position
	ADD	TT,BPTAB(PIC)
	MOVE	PICPNT,PICPT2
	ADD	PICPNT,(TT)

	LDB	TT,PICPNT		;pick up first affected picture byte
	JUMPE	XHI,RTL2(XHR)		;if only one altogether, skip loop
	MOVE	NFWD,XHI		;if more than one, do first fractional
	JRST	STL2(XLR)		;one

FWL2:	SUB	PICPNT,LNWD(PIC)
	LDB	TT,PICPNT		;and then do all the others but the last
STL2:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT		
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;check for byte overflow
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it
	SOJG	NFWD,FWL2

	SUB	PICPNT,LNWD(PIC)
	LDB	TT,PICPNT		;the last affected byte
	JRST	RTL2(XHR)		;see how much of it to do
RTL2:	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
	ILDB	T,BITPNT
	ADD	TT,T
  	CAILE	TT,BMAX(PIC)		;bounds check
	MOVEI	TT,BMAX(PIC)
	DPB	TT,PICPNT		;return it

	MOVE	T,BITPNT		;check if time to skip BP
	LSH	T,-36			;in font definition
	CAMGE	T,RASW			;to next line
	AND	BITPNT,[7777777777]

	AOBJN	YLO,YLOOP2		;check if all lines done
	POP	P,12
	JRST	@RETAD

        PRGEND
	TITLE	FNTVEC
	ENTRY	V3X2

PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14

T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ XD←5 ↔ XDR←XWID←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ NFWD←12 ↔ RASW←13 ↔ YEX←14 ↔ PICPT2←CHAR←15
P←17
RETAD:	0
V3X2:	POP	P,RETAD			; V3X2(PIC,YLO,XLO,XWID,XD,YD)
	POP	P,YD	    ;routine to make a vector xd wide, yd long slope xwid
	POP	P,XD
	POP	P,XWID
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
	MOVE	XHI,XLO
	ADD	XHI,-1(XWID)
	IDIVI	XLO,3
	IDIVI	XHI,3
	IDIVI	XD,3

YLP:	HRRZ	TT,YLO
	ASH	TT,-1
	ADDI	TT,LINTAB(PIC)
	MOVE	PICPNT,(TT)
	MOVEI	TT,-1(XLO)
	ADD	TT,BPTAB(TT)
	ADD	PICPNT,(TT)

	MOVE	NFWD,XHI
	SUBI	NFWD,1(XLO)
	MOVE	TT,XHR
	JUMPGE  NFWD,FRB
	SUB	TT,XLR
	JRST	LSB

FRB:	ILDB	T,PICPNT		;for first fractional byte
	ADD	T,(XLR)[3
			2
			1]
	CAMLE	T,BMAX(PIC)
	MOVE	T,BMAX(PIC)
	DPB	T,PICPNT

	JUMPE	NFWD,LSB
FLP:	ILDB	T,PICPNT		;for middle full bytes
	ADDI	T,3
	CAMLE	T,BMAX(PIC)
	MOVE	T,BMAX(PIC)
	DPB	T,PICPNT
	SOJG	NFWD,FLP

LSB:	ILDB	T,PICPNT		;for last fractional byte
	ADDI	T,1(TT)
	CAMLE	T,BMAX(PIC)
	MOVE	T,BMAX(PIC)
	DPB	T,PICPNT

	DADD	XLO,XD
	CAIL	XLR,3
	DSUB	XLO,[-1
		     3]
	DADD	XHI,XD
	CAIL	XHR,3
	DSUB	XHI,[-1
		     3]

	AOBJN	YLO,YLP

	END